package com.weijin.utils;

import cn.hutool.core.date.DateTime;

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Objects;

/**
 * @Author WeiJin
 * @Version 1.0
 * @Date 2025/3/13 11:34
 */
public class DateTimeUtil {
    private DateTimeUtil() {
    }

    private static final String format = "yyyy-MM-dd HH:mm:ss";
    private static final String dateFormat = "yyyy-MM-dd";
    /**
     * 获取当前时间 使用yyyy-MM-dd HH:mm:ss格式
     *
     * @return 返回当前时间
     */
    public static LocalDateTime getDateTime() {
        return LocalDateTime.parse(datetimeToStr(LocalDateTime.now()), DateTimeFormatter.ofPattern(format));
    }

    /**
     * 把字符串时间日期转为LocalDateTime格式
     *
     * @param dateTime 需要转换的字符串
     * @return 返回LocalDateTime格式
     */
    public static String datetimeToStr(LocalDateTime dateTime) {
        return DateTimeFormatter.ofPattern(format).format(dateTime);
    }

    /**
     * 将字符类型的时间日期转换位LocalDateTime类型
     *
     * @param strDatetime 字符串类型时间日期
     * @return LocalDateTime类型时间日期
     */
    public static LocalDateTime strToDatetime(String strDatetime) {
        return LocalDateTime.parse(strDatetime, DateTimeFormatter.ofPattern(format));
    }

    /**
     * 将字符类型的日期转换位LocalDateTime类型
     *
     * @param strDate 字符串类型日期
     * @return LocalDateTime类型日期
     */
    public static LocalDate strToDate(String strDate) {
        return LocalDate.parse(strDate, DateTimeFormatter.ofPattern(dateFormat));
    }

    /**
     * 判断是否迟到
     *
     * @param dateTime 时间
     * @return 是否迟到
     */
    public static boolean isLate(LocalDateTime dateTime) {
        // 晚于9点迟到，早于九点正常打卡
        return dateTime.toLocalTime().isAfter(LocalTime.of(9, 0));
    }


    /**
     * 判断是否早退
     *
     * @param dateTime 时间
     * @return 是否迟到
     */
    public static boolean isEarly(LocalDateTime dateTime) {
        // 晚于9点迟到，早于九点正常打卡
        return dateTime.toLocalTime().isBefore(LocalTime.of(16, 0));
    }

    /**
     * 计算迟到时长 单位秒
     *
     * @param dateTime 签到时间
     * @return 迟到时长
     */
    public static Long lateTime(LocalDateTime dateTime) {
        Duration duration = Duration.between(LocalTime.of(9, 0), dateTime.toLocalTime());
        return duration.getSeconds();
    }

    /**
     * 计算早退时长
     *
     * @param dateTime 签退时间
     * @return 早退时长
     */
    public static Long earlyTime(LocalDateTime dateTime) {
        Duration duration = Duration.between(LocalTime.of(18, 0), dateTime.toLocalTime());
        return duration.getSeconds();
    }

    /**
     * 将Datetime类型转换为LocalDateTime
     *
     * @param dateTime 时间
     * @return 转换后的时间
     */
    public static LocalDateTime convertLocalDateTime(String dateTime) {
        if (Objects.isNull(dateTime)) {
            throw new RuntimeException("时间对象为空，无法转换");
        }
        // 转换DateTime类型为LocalDateTime
        return LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern(format));
    }

    /**
     * 计算两个时间的相差的时间，返回类型为LocalTime
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 差值
     */
    public static LocalTime between(LocalDateTime startTime, LocalDateTime endTime) {
        Duration duration = Duration.between(startTime, endTime);
        // 时间相差秒数
        long durationSeconds = duration.getSeconds();
        // 计算小时
        int hours = (int) (durationSeconds / 3600);
        // 计算分钟
        int minutes = (int) (durationSeconds % 3600 / 60);
        // 计算秒钟
        int seconds = (int) (durationSeconds % 60);
        // 生成相差时间并返回
        return LocalTime.of(hours, minutes, seconds);
    }
}
